package com.owen.shiro;

import at.pollux.thymeleaf.shiro.dialect.ShiroDialect;
import org.apache.shiro.spring.web.ShiroFilterFactoryBean;
import org.apache.shiro.web.mgt.DefaultWebSecurityManager;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import java.util.LinkedHashMap;
import java.util.Map;

@Configuration
public class ShiroConfig {

    // 创建ShiroFilterFactoryBean
    @Bean
    public ShiroFilterFactoryBean getShiroFilterFactoryBean(@Qualifier("securityManager") DefaultWebSecurityManager securityManager){
        ShiroFilterFactoryBean shiroFilterFactoryBean = new ShiroFilterFactoryBean();
        // 设置安全管理器
        shiroFilterFactoryBean.setSecurityManager(securityManager);
        // 添加Shiro的内置拦截器
        // Shiro的内置拦截器，可以实现权限相关的拦截
        // anon : 无需认证，可以访问
        // authc : 必须认证才能访问(必须登录才能访问)
        // user : 如果使用rememberMe的功能可以直接访问
        // perms : 该资源必须得到资源权限才可以访问
        // role : 该资源必须得到角色权限才可以访问

        // 该集合表示要拦截的资源
        // 以资源路径为键，过滤级别为value
        Map<String,String> filterMap = new LinkedHashMap<String,String>();
        // add资源，使用authc拦截

//        filterMap.put("/add","authc");
//        filterMap.put("/update","authc");

        filterMap.put("/test","authc");

//        filterMap.put("/user/**","authc"); 通配方式拦截
//        filterMap.put("/login","anon"); 对登录页面的放行，不去拦截
        filterMap.put("/login","anon");

        // 授权过滤器
        // 当授权拦截后会自动跳转到未授权页面
        filterMap.put("/add","perms[user:add]");//[]中自定义授权字符串
        filterMap.put("/update","perms[user:update]");

        shiroFilterFactoryBean.setFilterChainDefinitionMap(filterMap);
        // 修改跳转的登录页面
        shiroFilterFactoryBean.setLoginUrl("/login");
        // 设置为授权页面
        shiroFilterFactoryBean.setUnauthorizedUrl("/unAuth");

        return shiroFilterFactoryBean;
}


    // 创建DefaultWebSecurityManager
    @Bean(name = "securityManager")
    public DefaultWebSecurityManager getDefaultWebSecurityManager(@Qualifier("userRealm") UserRealm userRealm){
        DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager();
        // 关联Realm
        securityManager.setRealm(userRealm);
        return securityManager;
    }


    // 创建Realm(自定义)
    @Bean(name = "userRealm")
    public UserRealm getUserRealm(){
        return new UserRealm();
    }


    // 配置ShiroDialect,用于thymeleaf和Shiro标签配合使用
    @Bean
    public ShiroDialect getShiroDialect(){
        return  new ShiroDialect();
    }

}